﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OWLServer.owl.tipos;

namespace OWLServerQL.dominio
{
    /// <summary>
    /// Clase que representa a un conjunto de elementos de la consulta
    /// </summary>
    public class ConjuntoElementos : Elemento
    {
        private Elemento elementoInicial;

        /// <summary>
        /// Elemento inicial del conjunto de elementos
        /// </summary>
        public Elemento ElementoInicial
        {
            get { return elementoInicial; }
            set { elementoInicial = value; }
        }

        public ConjuntoElementos(Elemento elementoInicial) : base()
        {
            ElementoInicial = elementoInicial;
        }

        public ConjuntoElementos(Elemento elementoInicial, TipoElemento tipoElemento)
            : base(tipoElemento)
        {
            ElementoInicial = elementoInicial;
        }

        override public String ToString() {
		    StringBuilder bf = new StringBuilder();

		    bf.Append("\n---------------PARENTESIS----------------");
            bf.Append("\nTipo Elemento: ");
            bf.Append(base.TipoElemento);
            bf.Append("\nNegado: ");
            bf.Append(base.Negado);
            bf.Append("\nUnion Anterior: ");
            bf.Append(base.UnionAnterior);
            bf.Append("\n++++++++++++>\n");
            bf.Append(ElementoInicial.ToString());
            bf.Append("\n---------------PARENTESIS----------------");
            if (base.ElementoSiguiente != null)
            {
                bf.Append(base.ElementoSiguiente.ToString());
            }
		
		    return bf.ToString();
	    }

        /// <summary>
        /// Comopone la lista de individuos que se están buscando en la consulta
        /// </summary>
        /// <param name="individuosOntologia">Lista de individuos de la Onlología seleccionada</param>
        /// <returns></returns>
        override public List<Individuo> owlServerQLToIndividuos(TipoElemento tipoElemento, List<Individuo> individuosOntologia)
        {
            List<Individuo> resultado = null;
            base.owlServerQLToIndividuos(tipoElemento, individuosOntologia);
            List<Individuo> conjuntoIzquierda = ElementoInicial.owlServerQLToIndividuos(TipoElemento, individuosOntologia);
            List<Individuo> conjuntoDerecha = ElementoSiguiente == null ? null : ElementoSiguiente.owlServerQLToIndividuos(TipoElemento, individuosOntologia);
            resultado = unionIndividuos(conjuntoIzquierda, conjuntoDerecha);           

            return resultado;
        }
    }
}
